package br.com.klis.batendoumabola.client.widgets;

import java.util.ArrayList;

import br.com.klis.batendoumabola.client.event.GaleriaAtualizadaEvent;
import br.com.klis.batendoumabola.client.event.GaleriaAtualizadaEventHandler;
import br.com.klis.batendoumabola.client.service.ImagemDoBateBolaService;
import br.com.klis.batendoumabola.client.service.ImagemDoBateBolaServiceAsync;
import br.com.klis.batendoumabola.client.util.Helper;
import br.com.klis.batendoumabola.shared.DadosDaImagem;
import br.com.klis.batendoumabola.shared.LoginInfo;

import com.google.gwt.core.client.GWT;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Widget;

public class Galeria extends Composite implements GaleriaAtualizadaEventHandler{
	private VerticalPanel galeriaPanel = new VerticalPanel();
	private FlexTable tabelaDeImagens = new FlexTable();
	private LoginInfo loginInfo;
	private ArrayList<Image> galeria = new ArrayList<Image>();
	private final ImagemDoBateBolaServiceAsync imageService = GWT.create(ImagemDoBateBolaService.class);
	private ArrayList<DadosDaImagem> imagens = new ArrayList<DadosDaImagem>();
	private int numLinhas = 3;
	private int numColunas = 5;
	private Long entidadeId;
	private final GaleriaAtualizadaEventHandler galeriaHandler;
	private Boolean enabled = false;
	
	public Galeria(LoginInfo loginInfo, Long entidadeId) {
		GWT.log("init galeria...");
		this.loginInfo = loginInfo;
		this.entidadeId = entidadeId;
		galeriaHandler = this;
		
		tabelaDeImagens.setCellSpacing(10);
		tabelaDeImagens.setSize("100%", "100%");
		tabelaDeImagens.setStyleName("TabelaDeImagens");
		
		galeriaPanel.add(tabelaDeImagens);
		initWidget(galeriaPanel);
	}
	
	public Boolean getEnabled() {
		return enabled;
	}

	public void setEnabled(Boolean enabled) {
		this.enabled = enabled;
	}

	public void add(Image imagem){
		galeria.add(imagem);
	}
	
	public void loadGaleria(){
		GWT.log("Carregando a galeria: "+entidadeId.toString());
		galeria = new ArrayList<Image>();
		imageService.getImagensDoBateBola(entidadeId, new AsyncCallback<ArrayList<DadosDaImagem>>() {
			public void onSuccess(ArrayList<DadosDaImagem> result) {
				imagens = result;
				GWT.log("Retornou do servico de imagens: "+imagens.size());
				
				Widget widget;
				int contador = 0;
				for (int l=0; l<numLinhas; l++){
					for (int c=0; c<numColunas; c++){
						if(contador < imagens.size()){
							Thumb thumb = new Thumb(loginInfo, imagens.get(contador),galeriaHandler,Galeria.this);
							//thumb.setGaleriaHandler(galeriaHandler);
							widget = thumb.getImagem();
							add(thumb.getImagem());
							contador++;
						}else{
							widget = new HTML("<b>Em Branco</b>"); 
						}
						adicionaImagemNaTabela(l,c,widget);
					}
				}
			}

			public void onFailure(Throwable error) {
				Helper.handleError(error,loginInfo);
			}
		});
	}
	
	/**
	 * Adiciona uma imagem na galeria
	 * @param imageId
	 */
	public void adicionaNaGaleria(DadosDaImagem dados){
	    int linha;
	    int coluna;
	    int resto = 0;
	    Thumb thumb = new Thumb(loginInfo,dados,galeriaHandler,Galeria.this);
	    add(thumb.getImagem());
	    int tamanhoGaleria = galeria.size();
	    if (tamanhoGaleria <= numColunas){
	    	linha = 0;
	    	coluna = tamanhoGaleria - 1;
	    }else{
	    	linha = (tamanhoGaleria-1)/numColunas;
	    	resto = tamanhoGaleria%numColunas;
	    	if (resto == 0){
	    		coluna = numColunas - 1;
	    	}else{
	    		coluna = resto - 1;	
	    	}
	    }
	    adicionaImagemNaTabela(linha, coluna, thumb.getImagem());
	}
	
	/**
	 * Adiciona um widget na tabela de imagens
	 * @param linha
	 * @param coluna
	 * @param widget
	 */
	private void adicionaImagemNaTabela(int linha, int coluna, Widget widget){
		tabelaDeImagens.setWidget(linha, coluna, widget);
		tabelaDeImagens.getCellFormatter().addStyleName(linha, coluna, "TabelaDeImagens");
	}

	@Override
	public void onGaleriaAtualizada(GaleriaAtualizadaEvent event) {
		loadGaleria();
	}
	
}
